package com.common.util.utils;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.IntDef;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.common.util.R;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;


/**
 * 标准控件之Toast
 *
 * @author ljb
 * @version 1.0.0
 * @date 2016.02.23
 */
public class ToastUtils {

    private static final String TAG = "ToastUtils";

    // Toast对象
    private static Toast toast = null;
    private static TextView textView;

    // 显示时间常量
    @IntDef({LENGTH_SHORT, LENGTH_LONG})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Duration {
    }


    public static final int LENGTH_SHORT = 0;
    public static final int LENGTH_LONG = 1;

    private static Handler handler = new Handler(Looper.getMainLooper());

    /**
     * 屏幕居中显示
     *
     * @param context 上下文
     * @param text    显示的内容
     */
    public static void showCenter(Context context, CharSequence text) {
        show(context, text, true);
    }

    /**
     * 屏幕居中显示
     *
     * @param context  上下文
     * @param stringId 显示内容对应的资源id
     */
    public static void showCenter(Context context, int stringId) {
        if (context == null || context.getResources() == null) {
            return;
        }

        String str = context.getResources().getString(stringId);
        show(context, str, true);
    }

    /**
     * 屏幕底部显示
     *
     * @param context 上下文
     * @param text    显示的内容
     */
    public static void showBottom(Context context, CharSequence text) {
        show(context, text, false);
    }

    /**
     * 屏幕底部显示
     *
     * @param context  上下文
     * @param stringId 显示内容对应的资源id
     */
    public static void showBottom(Context context, int stringId) {
        if (context == null || context.getResources() == null) {
            return;
        }

        String str = context.getResources().getString(stringId);
        show(context, str, false);
    }

    /**
     * 根据显示内容的长度自动调节显示时长
     *
     * @param context  上下文
     * @param text     显示的内容
     * @param isCenter 是否居中显示
     */
    private static void show(Context context, CharSequence text, boolean isCenter) {
        if (null == context) {
            return;
        }

        if (null == text) {
            showMessage(context, "", LENGTH_SHORT, isCenter);
        } else if (text.length() < 10) {
            showMessage(context, text, LENGTH_SHORT, isCenter);
        } else {
            showMessage(context, text, LENGTH_LONG, isCenter);
        }
    }

    /**
     * 默认情况下，Toast只能在主线程中显示，如果在子线程中显示，需要增加Looper
     *
     * @param context  上下文
     * @param message  显示的内容
     * @param length   显示时长
     * @param isCenter 是否居中显示
     */
    public static void showMessage(final Context context, final CharSequence message, @Duration final int length, final boolean isCenter) {
        if (Thread.currentThread() == Looper.getMainLooper().getThread()) {

            showMessagePure(context, message, length, isCenter);

        } else {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    showMessagePure(context, message, length, isCenter);
                }
            });
        }
    }

    /**
     * 封装系统Toast控件，增加是否居中的逻辑
     *
     * @param context  上下文
     * @param message  显示的内容
     * @param length   显示时长
     * @param isCenter 是否居中显示
     */
    private static void showMessagePure(final Context context, final CharSequence message, @Duration final int length, final boolean isCenter) {

        if (handler == null) {
            return;
        }

        if (toast == null || textView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.toast_layout, null);
            textView = (TextView) view.findViewById(R.id.tv_toast_text);
            toast = new Toast(context);
            toast.setView(view);
        }

        toast.setDuration(length);
        if (isCenter) {
            toast.setGravity(Gravity.CENTER, 0, 0);
        }

        handler.post(new Runnable() {
            @Override
            public void run() {
                if (textView != null) {
                    textView.setText(message);
                }
            }
        });
        toast.show();
    }


}
